core: Ensure file data is synced to disk when checking out via non-hardlinks
authorColin Walters <walters@verbum.org>
Fri, 12 Oct 2012 17:09:10 +0000 (13:09 -0400)
committerColin Walters <walters@verbum.org>
Fri, 12 Oct 2012 17:09:10 +0000 (13:09 -0400)
Otherwise we aren't crash-safe.

src/libostree/ostree-repo.c

index 8fe99347c111c8617b8f2067f99122dc8b2f8408..b63df8d9247682ec360d648dbf7df5bd5813f662 100644 (file)
@@ -3141,12 +3141,14 @@ checkout_file_from_input (GFile          *file,
 
       xattrs = NULL;
     }
+  else
+    temp_info = g_object_ref (finfo);
 
   if (overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES)
     {
-      if (g_file_info_get_file_type (temp_info ? temp_info : finfo) == G_FILE_TYPE_DIRECTORY)
+      if (g_file_info_get_file_type (temp_info) == G_FILE_TYPE_DIRECTORY)
         {
-          if (!ostree_create_file_from_input (file, temp_info ? temp_info : finfo,
+          if (!ostree_create_file_from_input (file, temp_info,
                                               xattrs, input,
                                               cancellable, &temp_error))
             {
@@ -3165,11 +3167,10 @@ checkout_file_from_input (GFile          *file,
         {
           dir = g_file_get_parent (file);
           if (!ostree_create_temp_file_from_input (dir, NULL, "checkout",
-                                                   temp_info ? temp_info : finfo,
-                                                   xattrs, input, &temp_file, 
+                                                   temp_info, xattrs, input, &temp_file, 
                                                    cancellable, error))
             goto out;
-          
+
           if (rename (ot_gfile_get_path_cached (temp_file), ot_gfile_get_path_cached (file)) < 0)
             {
               ot_util_set_error_from_errno (error, errno);
@@ -3179,11 +3180,17 @@ checkout_file_from_input (GFile          *file,
     }
   else
     {
-      if (!ostree_create_file_from_input (file, temp_info ? temp_info : finfo,
+      if (!ostree_create_file_from_input (file, temp_info,
                                           xattrs, input, cancellable, error))
         goto out;
     }
 
+  if (g_file_info_get_file_type (temp_info) == G_FILE_TYPE_REGULAR)
+    {
+      if (!ensure_file_data_synced (file, cancellable, error))
+        goto out;
+    }
+
   ret = TRUE;
  out:
   return ret;